package com.wei.czz.framework.blog.controller;

import com.wei.czz.common.annotation.AuthLogin;
import com.wei.czz.common.dto.echarts.LineEchartsDto;
import com.wei.czz.common.dto.admin.AdminDto;
import com.wei.czz.common.enums.blog.BlogStatsFlowEnum;
import com.wei.czz.common.tool.Result;
import com.wei.czz.common.utils.SecurityUtils;
import com.wei.czz.common.vo.admin.AdminVo;
import com.wei.czz.framework.blog.manager.BlogStatsManager;
import com.wei.czz.framework.common.service.AsyncService;
import lombok.AllArgsConstructor;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.*;

import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import java.util.regex.Pattern;


/**
 * Created by IntelliJ IDEA.
 *
 * @author wei
 * date: 2022-03-01 10:04:45
 * className: BlogStatsController
 * version: 1.0
 * description:
 */
@RestController
@RequestMapping("sys/blog-stats")
@AllArgsConstructor
public class BlogStatsController {

    private static final Logger log = LoggerFactory.getLogger(BlogStatsController.class);

    private final BlogStatsManager blogStatsManager;

    private final AsyncService asyncService;

    /**
     * 用户博客统计数据接口
     * 根据请求参数，获取
     *  1、用户已发布博客数、浏览数、点赞数和评论数
     *  2、对应统计类型的图标数据
     *
     * 调用方：
     *  1、浏览器-后台管理页面-首页面调用
     *
     * @param adminVo 用户博客统计请求参数对象
     * @return 请求结果
     */
    @PostMapping("/admin")
    @AuthLogin
    public Result<AdminDto> getUserAdminPage(@RequestBody AdminVo adminVo) {
        log.info("开始用户博客统计数据业务。{}", adminVo);

        if (adminVo.isParamFail()) {
            log.info("用户统计数据接口请求参数错误");
            return Result.paramFail();
        }
        BlogStatsFlowEnum userBlogStats = BlogStatsFlowEnum.getUserBlogStats(adminVo.getType());
        if (userBlogStats == null) {
            log.info("用户统计数据接口，统计类型不正确");
            return Result.paramFail();
        }
        BlogStatsFlowEnum dataValue = BlogStatsFlowEnum.getDataValue(adminVo.getValueType());
        if (BlogStatsFlowEnum.ISSUE_BLOG_STATS != userBlogStats && dataValue == null) {
            log.info("用户统计数据接口，数值类型不正确");
            return Result.paramFail();
        }
        // 获取正在查询自己统计信息的用户id
        Long optUserId = SecurityUtils.getUserId();

        AdminDto adminDto = new AdminDto();
        Future<AdminDto> future = null;
        if (StringUtils.isNotBlank(adminVo.getRefresh())) {
            if (!Pattern.matches("^[0-3](,[0-3]){0,3}$", adminVo.getRefresh())) {
                log.info("用户统计数据接口，是否刷新统计参数格式错误");
                return Result.paramFail();
            }
            // 异步获取用户博客统计数据
            future = asyncService.supplyAsync(() ->
                    blogStatsManager.getUserBlogStats(optUserId, adminVo, userBlogStats, dataValue)
            );
        }
        // 主业务
        LineEchartsDto lineEchartsDto = blogStatsManager.getUserBlogStats(optUserId, userBlogStats, dataValue);

        if (future != null) {
            try {
                adminDto = future.get();
            } catch (InterruptedException | ExecutionException e) {
                log.error("异步获取用户博客统计数据异常。message={}", e.getMessage(), e);
                return Result.fail("查询用户博客统计数据失败，请联系管理员处理！！");
            }
        }
        adminDto.setLineEchartsDto(lineEchartsDto);

        log.info("用户博客统计数据业务结束");
        return Result.success(adminDto);
    }
}
